package org.zxw.interceptor;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.zxw.utils.BaseContext;
import org.zxw.utils.JwtUtil;

/**
 * jwt令牌校验的拦截器  
 */  
@Component
public class JwtTokenUserInterceptor implements HandlerInterceptor {

    private final JwtUtil jwtUtil;

    public JwtTokenUserInterceptor(JwtUtil jwtUtil) {
        this.jwtUtil = jwtUtil;
    }
  
    /**  
     * 校验jwt  
     *     * @param request  
     * @param response  
     * @param handler  
     * @return  
     * @throws Exception  
     */    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //判断当前拦截到的是Controller的方法还是其他资源  
        if (!(handler instanceof HandlerMethod)) {
            //当前拦截到的不是动态方法，直接放行  
            return true;  
        }  
  
        //1、从请求头中获取令牌  
        String token = request.getHeader(jwtUtil.getToken());
  
        //2、校验令牌  
        try {
            String subject = jwtUtil.getSubjectFromToken(token);
            Long empId = Long.valueOf(subject);
            BaseContext.setCurrentId(empId);
            //3、通过，放行  
            return true;  
        } catch (Exception ex) {  
            //4、不通过，响应401状态码  
            response.setStatus(401);  
            return false;  
        }  
    }  
}